home *** CD-ROM | disk | FTP | other *** search
/ Shareware Extravaganza - Disc 1 / ShareWare Extravaganza 1 of 4 (The Ultimate Shareware Company).iso / grprogs / picutil.exe / ALTER.SRC / MAIN.ASM < prev    next >
Assembly Source File  |  1986-10-16  |  14KB  |  329 lines

  1. ;╔═════════════════════════════════════════════════════════════════════════════╗
  2. ;║ ░░░░░░░░░░░ PROGRAM = MAIN.ASM ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  3. ;╚═════════════════════════════════════════════════════════════════════════════╝
  4. CSEG           SEGMENT PUBLIC BYTE
  5.            ASSUME  CS:CSEG,DS:CSEG
  6.            INCLUDE PUBLICS.EQU
  7.            INCLUDE STRUC.EQU
  8.  
  9.            EXTRN   BUFF_SIZE:WORD
  10.            EXTRN   FILENAME:BYTE
  11.            EXTRN   FILE_TYPE:WORD
  12.            EXTRN   DISK_BUFFER:WORD
  13.            EXTRN   FILE_SIZE:WORD
  14.            EXTRN   FLAGS:WORD
  15.            EXTRN   HANDLE_IN:WORD
  16.            EXTRN   HANDLE_OUT:WORD
  17.            EXTRN   HEIGHT_PIX:WORD
  18.            EXTRN   PROG_END:WORD
  19.            EXTRN   READ_PROG:WORD
  20.            EXTRN   TYPE_FROM:WORD
  21.            EXTRN   TYPE_TO:BYTE
  22.            EXTRN   STACK:WORD
  23.            EXTRN   WIDTH_BYTES:WORD
  24.            EXTRN   WRITE_PROG:WORD
  25.  
  26.            EXTRN   BREAK_ON:NEAR
  27.            EXTRN   BREAK_OFF:NEAR
  28.  
  29. TELL_HOW       DB      '┌─────────────────────────────────────────────────────────────┐',cr,lf
  30.            DB      '│syntax = ALTER filename.typ typ[i]                           │',cr,lf
  31.            DB      '├─────────────────────────────────────────────────────────────┤',cr,lf
  32.            DB      '│filename.typ = name of picture file....must have correct type│',cr,lf
  33.            DB      '│typ          = what to convert file format to                │',cr,lf
  34.            DB      '│i            = invert picture                                │',cr,lf
  35.            DB      '├─────────────────────────────────────────────────────┬───┬───┤',cr,lf
  36.            DB      '│the following types are valid:                       │IN │OUT│',cr,lf
  37.            DB      '│   BAS = BSAVE FILE FORMAT                           │ Y │ N │',CR,LF
  38.            DB      '│   CUT = DR. HALO II FORMAT                          │ Y │ Y │',CR,LF
  39.            DB      '│   IMG = EFS IMAGE FILE                              │ Y │ Y │',CR,LF
  40.            DB      '│   MSP = MICROSOFT PAINT FORMAT                      │ Y │ Y │',CR,LF
  41.            DB      '│   PGA = PROFESSIONAL GRAPHICS DISPLAY FORMAT        │ N │ Y │',CR,LF
  42.            DB      '│   PIC = MOUSE SYSTEMS PCPAINT 1.50 FORMAT           │ Y │ N │',CR,LF
  43.            DB      '│   PIG = PIXEL IMAGE GENERATION (RICOH IS30 FORMAT)  │ Y │ Y │',CR,LF
  44.            DB      '│   RAS = SHOW FILE FORMAT                            │ Y │ N │',CR,LF
  45.            DB      '│   07/16/1986                                        │   │   │',CR,LF
  46.            DB      '└─────────────────────────────────────────────────────┴───┴───┘',cr,lf
  47.            DB      7,'$'
  48. OPEN_ERROR     DB      'open error on input file',cr,lf,'$'
  49. CREATE_ERROR   DB      'create error on output file',cr,lf,'$'
  50. TYPE_ERROR     DB      'error in type of input file',cr,lf
  51.            Db      'must be BAS,CUT,FNT,IMG,MSP,PGA,PIC,PIG, or RAS',cr,lf,'$'
  52. NOT_IMP        DB      'NOT IMPLIMENTED YET',CR,LF,'$'
  53. ;╔═════════════════════════════════════════════════════════════════════════════╗
  54. ;║ ░░░░░░░░░░░ MAIN.ASM ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  55. ;╚═════════════════════════════════════════════════════════════════════════════╝
  56. MAIN           PROC    FAR
  57. ;┌─────────────────────────────────────────────────────────────────────────────┐
  58. ;│           RETURN SETUP                               │
  59. ;└─────────────────────────────────────────────────────────────────────────────┘
  60.            CLI
  61.            MOV     AX,CS               ;TEMP STACK
  62.            MOV     SS,AX               ;
  63.            MOV     ES,AX               ;
  64.            MOV     SP,OFFSET STACK           ;
  65.            STI
  66.            PUSH    DS               ;
  67.            XOR     AX,AX               ;
  68.            PUSH    AX               ;
  69. ;┌─────────────────────────────────────────────────────────────────────────────┐
  70. ;│           GET FILENAME FROM COMMAND LINE                       │
  71. ;└─────────────────────────────────────────────────────────────────────────────┘
  72.            MOV     SI,82H               ;START OF FILENAME
  73.            XOR     CH,CH               ;
  74.            MOV     CL,DS:[SI-2]           ;SIZE OF FILENAME
  75.            CMP     CX,0               ;NO COMMANDS
  76.            JE      GFN800               ;ERROR
  77.            MOV     DI,OFFSET FILENAME      ;STORE FILENAME HERE
  78. GFN100:
  79.            LODSB                   ;GET CHARACTER
  80.            CMP     AL,20H               ;END OF FILENAME?
  81.            JE      GFN700               ;YES....BRANCH
  82.            CMP     AL,CR               ;END OF COMMAND LINE?
  83.            JE      GFN800               ;YES....ERROR
  84.            STOSB                   ;SAVE CHARACTER
  85.            CMP     AL,'.'                  ;START OF TYPE
  86.            JNE     GFN200               ;
  87.            MOV     CS:TYPE_FROM,DI           ;START OF TYPE
  88. GFN200:
  89.            LOOP    GFN100               ;GET ANOTHER CHARACTER
  90.            JMP     SHORT GFN800           ;ERROR IF DONE ALREADY
  91. GFN300:
  92.            LODSB                   ;GET CHARACTER
  93.            CMP     AL,CR               ;END OF COMMAND LINE?
  94.            JE      GFN900               ;YES....ERROR
  95.            AND     AL,0DFH               ;CONVERT TO UPPER CASE
  96.            STOSB                   ;SAVE CHARACTER
  97.            LOOP    GFN300               ;GET ANOTHER CHARACTER
  98.            JMP     SHORT GFN800           ;ERROR IF DONE
  99. GFN700:                        ;
  100.            MOV     AL,0               ;
  101.            STOSB                   ;
  102.            MOV     DI,OFFSET TYPE_TO       ;
  103.            LOOP    GFN300
  104. GFN800:
  105.            MOV     DX,OFFSET TELL_HOW      ;
  106.            JMP     ERROR               ;
  107. GFN900:
  108.            MOV     AL,0               ;PUT NULL AT END OF STRING
  109.            STOSB                   ;
  110.            CMP     WORD PTR CS:TYPE_FROM,0 ;
  111.            JE      GFN800               ;ERROR
  112. ;┌─────────────────────────────────────────────────────────────────────────────┐
  113. ;│           TURN BREAK KEY ON                           │
  114. ;└─────────────────────────────────────────────────────────────────────────────┘
  115. SET_BREAK:
  116.            MOV     AX,CS               ;SET DATA SEGMENT
  117.            MOV     DS,AX               ;
  118.            CALL    BREAK_ON            ;SET UP CONTROL BREAK
  119. ;┌─────────────────────────────────────────────────────────────────────────────┐
  120. ;│           FIND DISK MEMORY                            │
  121. ;└─────────────────────────────────────────────────────────────────────────────┘
  122.            MOV     AX,OFFSET PROG_END      ;
  123.            MOV     BX,CS               ;
  124.            SHR     AX,1               ;
  125.            SHR     AX,1               ;
  126.            SHR     AX,1               ;
  127.            SHR     AX,1               ;
  128.            ADD     BX,AX               ;
  129.            INC     BX               ;
  130.            MOV     DISK_BUFFER+2,BX      ;
  131. ;┌─────────────────────────────────────────────────────────────────────────────┐
  132. ;│           OPEN INPUT FILE                               │
  133. ;└─────────────────────────────────────────────────────────────────────────────┘
  134.            MOV     AH,3DH               ;OPEN FILE FOR READ
  135.            MOV     AL,0H               ;
  136.            MOV     DX,OFFSET FILENAME      ;
  137.            INT     21H               ;
  138.            JNC     OIF100
  139.            MOV     DX,OFFSET OPEN_ERROR    ;
  140.            JMP     ERROR
  141. OIF100:
  142.            MOV     HANDLE_IN,AX
  143. ;┌─────────────────────────────────────────────────────────────────────────────┐
  144. ;│           GET FILETYPE                               │
  145. ;└─────────────────────────────────────────────────────────────────────────────┘
  146.            MOV     DI,OFFSET FILE_TYPE
  147.            MOV     SI,TYPE_FROM
  148.            AND     BYTE PTR [SI],0DFH      ;CONVERT TYPE TO UPPER CASE
  149.            AND     BYTE PTR [SI+1],0DFH    ;
  150.            AND     BYTE PTR [SI+2],0DFH    ;
  151. GF050:
  152.            XOR     BX,BX               ;
  153.            CMP     BYTE PTR [DI],0           ;END OF TABLE?
  154.            JNE     GF075               ;NO..CONTINUE
  155.            MOV     DX,OFFSET TYPE_ERROR    ;YES....ERROR
  156.            JMP     ERROR               ;
  157. GF075:
  158.            MOV     CX,3               ;MUST FIND A MATCH OF 3 CHAR.
  159. GF100:
  160.            MOV     AL,[SI+BX]           ;GET FILE TYPE
  161.            CMP     AL,[DI+BX]           ;COMPARE TO TABLE
  162.            JNE     GF200               ;GO TO NEXT ENTRY
  163.            INC     BX
  164.            LOOP    GF100               ;MATCH...TRY AGAIN
  165.            JMP     GF300               ;GOOD NAME...BRANCH
  166. GF200:
  167.            ADD     DI,13               ;GO TO NEXT ENTRY
  168.            JMP     SHORT GF050           ;
  169. GF300:
  170.            MOV     SI,[DI.HEADER]           ;GET LOCATION OF HEADER INFO
  171.            MOV     CX,[SI]               ;GET NUMBER OF BYTES IN HEADER
  172.            CMP     CX,0
  173.            JE      GF325
  174.            MOV     DX,SI               ;
  175.            ADD     DX,2               ;GET PAST BYTES IN HEADER
  176.            MOV     AH,3FH               ;READ HEADER
  177.            MOV     BX,HANDLE_IN           ;
  178.            INT     21H               ;
  179. GF325:
  180.            MOV     BX,[DI.DISK_IN]           ;GET DISK INPUT PROGRAM
  181.            CMP     BX,0               ;
  182.            JE      GF350               ;
  183.            MOV     READ_PROG,BX           ;
  184.            MOV     BX,[DI.INPUT]           ;
  185.            CALL    BX               ;TRANSLATE INPUT HEADER
  186.            JNC     GF400               ;
  187. GF350:
  188.            MOV     DX,OFFSET NOT_IMP       ;
  189.            JMP     ERROR               ;
  190. GF400:
  191. ;┌─────────────────────────────────────────────────────────────────────────────┐
  192. ;│           CHANGE FILENAME                               │
  193. ;└─────────────────────────────────────────────────────────────────────────────┘
  194.            MOV     SI,OFFSET TYPE_TO       ;CHANGE TYPE ON FILENAME
  195.            MOV     DI,TYPE_FROM           ;
  196.            MOV     CX,3               ;
  197.            REP     MOVSB               ;
  198. ;┌─────────────────────────────────────────────────────────────────────────────┐
  199. ;│           CHECK FOR OPTIONS                           │
  200. ;└─────────────────────────────────────────────────────────────────────────────┘
  201. OPT100:
  202.            LODSB
  203.            CMP     AL,0               ;END OF OPTIONS?
  204.            JE      OPT900               ;YES GO ON
  205.            AND     AL,0DFH
  206.            CMP     AL,'I'                  ;INVERT PIXEL DATA
  207.            JNE     OPT100               ;
  208.            OR      FLAGS,INVERT_OUT        ;
  209. OPT900:
  210. ;┌─────────────────────────────────────────────────────────────────────────────┐
  211. ;│           CREATE OUTPUT FILE                           │
  212. ;└─────────────────────────────────────────────────────────────────────────────┘
  213.            MOV     AH,3CH               ;
  214.            MOV     CX,20H               ;
  215.            MOV     DX,OFFSET FILENAME      ;
  216.            INT     21H               ;
  217.            JNC     COF100
  218.            MOV     DX,OFFSET CREATE_ERROR  ;
  219.            JMP     ERROR
  220. COF100:
  221.            MOV     HANDLE_OUT,AX
  222. ;┌─────────────────────────────────────────────────────────────────────────────┐
  223. ;│           GET OUTPUT FILETYPE                           │
  224. ;└─────────────────────────────────────────────────────────────────────────────┘
  225.            MOV     DI,OFFSET FILE_TYPE
  226.            MOV     SI,OFFSET TYPE_TO
  227. GOF050:
  228.            XOR     BX,BX               ;
  229.            CMP     BYTE PTR [DI],0           ;END OF TABLE?
  230.            JNE     GOF075               ;NO..CONTINUE
  231.            MOV     DX,OFFSET TYPE_ERROR    ;YES....ERROR
  232.            JMP     ERROR               ;
  233. GOF075:
  234.            MOV     CX,3               ;MUST FIND A MATCH OF 3 CHAR.
  235. GOF100:
  236.            MOV     AL,[SI+BX]           ;GET FILE TYPE
  237.            CMP     AL,[DI+BX]           ;COMPARE TO TABLE
  238.            JNE     GOF200               ;GO TO NEXT ENTRY
  239.            INC     BX
  240.            LOOP    GOF100               ;MATCH...TRY AGAIN
  241.            JMP     GOF300               ;GOOD NAME...BRANCH
  242. GOF200:
  243.            ADD     DI,13               ;GO TO NEXT ENTRY
  244.            JMP     SHORT GOF050           ;
  245. GOF300:
  246.            MOV     SI,[DI.HEADER]           ;GET LOCATION OF HEADER INFO
  247.            MOV     BX,[DI.DISK_OUT]        ;GET DISK OUTPUT PROGRAM
  248.            CMP     BX,0               ;
  249.            JE      GOF350               ;
  250.            MOV     WRITE_PROG,BX           ;
  251.            MOV     BX,[DI.OUTPUT]           ;FIX UP OUTPUT HEADER
  252.            CALL    BX               ;
  253.            JNC     GOF400               ;
  254. GOF350:
  255.            MOV     DX,OFFSET NOT_IMP       ;
  256.            JMP     ERROR               ;
  257. GOF400:
  258.            MOV     CX,[SI]               ;GET NUMBER OF BYTES IN HEADER
  259.            MOV     DX,SI               ;
  260.            ADD     DX,2               ;GET PAST BYTES IN HEADER
  261.            MOV     AH,40H               ;WRITE HEADER
  262.            MOV     BX,HANDLE_OUT           ;
  263.            INT     21H               ;
  264. ;┌─────────────────────────────────────────────────────────────────────────────┐
  265. ;│           FIND FILE SIZE                               │
  266. ;└─────────────────────────────────────────────────────────────────────────────┘
  267.            MOV     AX,8000H            ;SET BUFFER SIZE
  268.            XOR     DX,DX
  269.            DIV     WIDTH_BYTES           ;AX = NUMBER IF LINES
  270.            MUL     WIDTH_BYTES
  271.            MOV     BUFF_SIZE,AX           ;BUFFER SIZE
  272.  
  273.            MOV     AX,WIDTH_BYTES
  274.            MUL     HEIGHT_PIX
  275.            MOV     FILE_SIZE,AX
  276.            MOV     FILE_SIZE+2,DX
  277. ;┌─────────────────────────────────────────────────────────────────────────────┐
  278. ;│           MOVE PICTURE DATA BETWEEN FILES                       │
  279. ;└─────────────────────────────────────────────────────────────────────────────┘
  280. MP100:
  281.            CALL    [READ_PROG]           ;
  282.            PUSHF                   ;
  283. ;           SUB     FILE_SIZE,AX           ;
  284. ;           JNC     MP175               ;
  285. ;           DEC     FILE_SIZE+2           ;
  286. ;           CMP     FILE_SIZE+2,0
  287. ;           JNE     MP175               ;
  288. ;           ADD     FILE_SIZE,AX           ;
  289. ;           MOV     AX,FILE_SIZE           ;
  290. MP175:
  291.            push    dx
  292.            push    ax
  293.            mov     ah,2
  294.            mov     dl,'.'
  295.            int     21h
  296.            pop     ax
  297.            pop     dx
  298.  
  299.            CALL    [WRITE_PROG]           ;
  300.            JNC     MP200               ;
  301.            POPF                   ;WRITE PROGRAM ABORTING
  302.            JMP     SHORT MP300           ;
  303. MP200:                           ;
  304.            POPF                   ;
  305.            JNC     MP100               ;
  306. MP300:                           ;
  307. ;┌─────────────────────────────────────────────────────────────────────────────┐
  308. ;│           CLOSE FILES                               │
  309. ;└─────────────────────────────────────────────────────────────────────────────┘
  310.            MOV     BX,HANDLE_IN           ;CLOSE FILE
  311.            MOV     AH,3EH               ;
  312.            INT     21H               ;
  313.            MOV     BX,HANDLE_OUT           ;CLOSE FILE
  314.            MOV     AH,3EH               ;
  315.            INT     21H               ;
  316.  
  317.            JMP     EXIT
  318. ERROR:
  319.            MOV     AX,CS
  320.            MOV     DS,AX
  321.            MOV     AH,9
  322.            INT     21H
  323. EXIT:
  324.            CALL    BREAK_OFF           ;BREAK KEY RESET
  325.            RET                   ;
  326. MAIN           ENDP
  327. CSEG           ENDS
  328.            END     MAIN
  329.